Ploting με τη βιβλιοθήκη matplotlib

Σε αυτή τη διάλεξη θα ασχοληθούμε με τη δημιουργία γραφικών παραστάσεων μέσα από τη βιβλιοθήκη matplotlib [wiki]

Πριν ξεκινήσουμε να αναφέρουμε ότι το "πλοτάρισμα" δεν ανήκει παραδοσιακά στο μάθημα του προγραμματισμού, αλλά σε αυτό της ανάλυσης δεδομένων. Παρόλα αυτά, ο προγραμματισμός στη βιολογία συνήθως ταυτίζεται με την ανάλυση κάποιων δεδομένων.

Το πλοτάρισμα είναι τέχνη!

Το καλό plot, δεν έχει να κάνει ούτε με το πόσο καλοί προγραμματιστές είσαστε αλλά ούτε και με τη ποιότητα των δεδομένων σας (αν και τα 2 βοηθάνε). Το καλό πλοτ έχει να κάνει με την αισθητική σας, την αντίληψή σας για τα χρώματα και την αίσθηση του μέτρου (οὐκ ἐν τῷ πολλῷ τὸ εὖ).

Για αυτό καλό είναι πριν (ή και μετά..) από αυτή τη διάλεξη να διαβάσουμε:

Ο συνηθισμένος τρόπος για να εισάγουμε (import) τη matplotlib είναι:

Στη συνέχεια για κάθε νέο plot πρέπει να δημιουργούμε τα εξής δύο αντικείμενα το fig και το ax

Γενικότερα: η matplotlib έχει τρία βασικά αντικείμενα για τον χειρισμό των plots:

Ας φτιάξουμε ένα άδειο plot!

Για να εμφανίσουμε ένα plot χρησιμοποιύμε την εντολή show() της plt

H ax.plot δέχεται μία μεγάλη ποικιλία από ορίσματα. Τα δύο πρώτα ορίσματα είναι δύο λίστες. Η πρώτη περιέχει τις συντεταγμένες στον άξονα Χ των στοιχείων που θέλουμε να κάνουμε plot, και η δεύτερη τις συντεταγμένες στον άξονα Υ. π.χ. Για να εμφανίσουμε μία τεθλασμένη γραμμή που περνάει από τα σημεία: (1,3), (2,5), (3,0) :

H plot δέχεται και ένα τρίτο όρισμα το οποίο είναι το "στυλ" της γραμμής. Αποτελείται από δύο μέρη: χρώμα και στυλ. Το χρώμα μπορεί να είναι (http://matplotlib.org/api/colors_api.html):

Σε περίπτωση που θέλουμε να κάνουμε plot κάποια γραμμή τότε το στυλ μπορεί να είναι είτε ένα από (http://matplotlib.org/api/lines_api.html#matplotlib.lines.Line2D.set_linestyle):

Σε περίπτωση που θέλουμε να κάνουμε plot μόνο τα σημεία (και όχι γραμμές) τότε οι επιλογές είναι (http://matplotlib.org/api/markers_api.html):

Υπάρχουν περισσότερες επιλογές και δυνατότητες για "καστομιές"¨: http://matplotlib.org/api/markers_api.html

Οπότε για να πλοτάρουμε μία κόκκινη διακεκομένη γραμμή:

Για να πλοτάρουμε μπλε πεντάγωνα:

Φυσικά υπάρχει πιο πλούσιος τρόπος να ορίσουμε ένα χρώμα με την παράμετρο "c"

Ναι, υπάρχει χρώμα που λέγεται "peru". Πλήρη λίστα με ονόματα υπάρχει εδώ: (http://matplotlib.org/examples/color/named_colors.html) . Εναλλακτικά μπορείτε να χρησιμοποιείσετε μία τιμή από το 0.0 μέχρι το 1.0 για να τυπώσετε σε ένα "grayscale" όπου το 0.0 είναι το μαύρο και το 1.0 είναι το άσπρο:

Φυσικά μπορείτε να χρησιμοποιήσετε ένα οποιοδίποτε RGB χρώμα. Υπάρχουν πολλά sites που μπορείς να επιλέξεις ένα χρώμα π.χ: http://htmlcolorcodes.com/

Μπορούμε να χρησιμοποιήσουμε πολλές φορές τη plot:

Ένας καλύτερος τρόπος για να πλοτάρουμε συναρτήσεις είναι να χρησιμοποιήσουμε τη linspace της numpy. H linspace(a,b,c) δημιουργεί μία αριθμητική πρόοδο από a μέχρι b, έτσι ώστε να υπάρχουν συνολικά c στοιχεία.

Το 100 στη linspace μπορούμε να το δούμε και ως την "ανάλυση της γραφικής παράστασης"

Παρατηρήστε πόσο "σπαστή" είναι η γραφική παράσταση

Με τη συνάρτηση ax.set_xlim, ax.set_ylim αλλάζουμε τα όρια των αξόνων

Μπορούμε επίσης να βάλουμε labels στους άξονες και σε όλο το πλοτ:

Μπορείτε να ορίσετε μέγεθος, γραμματοσειρά και στυλ στα labels

Με τη ax.set_xticks μπορείτε να ορίσεττε εσείς ποια ticks θα φαίνονται σε κάθε άξονα

Μπορείτε να αλλάξετε και το label του tick:

H συνάρτηση plot επιστρέφει έναν πίνακα από legends. Αυτά τα legends μπορούμε αν θέλουμε να να τα προσθέσουμε στο plot

Περισσότερα για το loc (location του legend δείτε εδώ: http://matplotlib.org/api/legend_api.html#matplotlib.legend.Legend)

Επίσης μπορούμε να προσθέσουμε ενα grid:

Προσθέστε ένα κείμενο στο σημείο Χ,Υ :

Επίσης υπάρχει η annotate με την οποία μπορείτε να βάλετε βελάκια

Πολλές φορές θέλουμε να τυπώσουμε δύο plots τα οποία να μοιράζονται τον ίδιο άξονα. Ας υποθέσουμε π.χ. ότι θέλουμενα μοιράζονται το άξονα Χ :

Επίσης μπορούμε να προσθέσουμε ένα ολόκληρο νέο πλότ μέσα σε ένα παλιό! Αυτό το κάνουμε με την εντολή fig.add_axes(). H add_axes ΑΓΝΟΕΙ το μέγεθος των αξόνων (π.χ. ο Χ έχει μέγεθος από 10 μέχρι 100 παραπάνω). Αντίθετα θεωρεί ότι ΟΛΟ το πλοτ είναι ένα καρτεσιανό γινόμενο [0,1]Χ[0,1] . Με την add_axes ορίζουμε τις διαστάσεις του νέου plot πάνω στο παλιό. Παράδειγμα

Η σημασιολογία των παραμέτρων της add_axes φαίνεται στο παρακάτω σχήμα:

Ας πλοτάρουμε μέσα στο sub-plot:

Μπορούμε επίης να αλλάξουμε τη κλίμακα των αξόνων σε λογαριθμική:

Μπορούμε να σώσουμε στο δίσκο ένα πλοτ μέσω της "plt.savefig()". Ανάλογα με την κατάληξη που θα βάλετε στο όνομα του αρχείου, θα το σώσει και σε διαφορετικό format. ΠΡΟΣΟΧΗ! τη savefig πρέπει να τη καλείτε ΠΡΙΝ τη plt.show()

Και το παράδειγμα που δουλέψαμε στη διάλεξη:

subplots

Μπορούμε να φτιάξουμε πολλά plots τα οποία να είναι στοιχισμένα σε ένα grid. Αυτό γίνεται αν στη subplots δώσουμε έναν ή δύο αριθμούς από subplots:

3 subplots κάθετα:

3 subplots οριζόντια:

Ένα grid από plots 2Χ3:

Παρατηρούμε ότι το ax είναι ένας πίνακας 2Χ3:

Άρα μπορούμε να αναφερθούμε σε οποιοδήποτε στοιχείο αυτού του πίνακα για να κάνουμε "γεμίσουμε" κάποια από αυτά τα sub-plots:

Κάποιες σημειώσεις:

Dendrogram

Ένα άλλο είδος plots ιδιαίτερα χρησιμο στη φυλογενετική είναι τα δεδρογράμματα. Για παράδειγμα ας υποθέσουμε ότι έχουμε 10 αντικείμενα και υπολογίζουμε όλες τις αποστάσεις ανά δύο (pairwise distances):

plotly

Η matplotlib ανοίκει στη κατηγορία των μη-interactive plots. Δλδ δεν μπορείς να αλληλεπιδράσεις με το plot (αν και στη τελευταία έκδοση έχουν προσθέσει κάποιες βασικές δυνατότητες). Φτιάχνει plots για παρουσιάσεις / papers και όχι για visual exploration! Στη 2η κατηγορία ανοίκουν άλλες βιβλιοθήκες όπως η bokeh και η plot.ly.

Η plotly χρειάζεται εγκατάστηση:

!pip install plotly

Ας δούμε μερικά παραδείγματα με τη plotly:

Κλασσικό ploy:

Το plot αυτό είναι διαδραστικό (interactive). Μπορούμε να το σώσουμε σαν html:

Scatter plot με plotly:

Ένα παράδειγμα με "κυκλικά plots". Το χλωροπλαστικό DNA της Arabidopsis thaliana. Για να κατεβάσετε τα δεδομένα για αυτό το plot: πάμε εδώ: ftp://ftp.ensemblgenomes.org/pub/plants/release-49/gff3/arabidopsis_thaliana και κατεβάζετε το αρχείο Arabidopsis_thaliana.TAIR10.49.chromosome.Pt.gff3.gz:

Seaborn

H seaborn είναι μια βιβλιθήκη για "statistical graphics". Δηλαδή παρέχει μεθόδους για πλοτάρισμα κατανομών, ιστογραμμάτων, ομαδοποίησης (clustering) κτλ.

Ένα παράδειγμα από εδώ: https://seaborn.pydata.org/generated/seaborn.displot.html

Η seaborn επιτρέπει επίσης την "ωραιοποίηση" των πλοτς της matplotlib. Ας δούμε ένα παράδειγμα:

Χωρίς seaborn:

Με seaborn:

Διαβάζουμε εδώ: http://seaborn.pydata.org/tutorial/aesthetics.html πως μπορούμε να επιλέξουμε διαφορετικά "στυλ" για το πλοτ μας από τη seaborn: http://seaborn.pydata.org/tutorial/aesthetics.html

Networkx

Η networkx είναι μία βιβλιοθήκη για την επεξεργασία αλλά και την οπτικοποίηση γράφων. Αφού την εγκαταστήσουμε (pip install...) μπορούμε να φτιάξουμε γράφους ως εξής:

GeoPandas

Η GeoPandas είναι μία επέκατση της pandas η οποία επιτρέπει την οπτικοποίηση γεωγραφικής πληροφορίας.

Δίνουμε ένα παράδειγμα:

plotly GEO interactive

Ομοίως μπορούμε να φτιάξουμε διαδραστικά πλοτς με γεωγραφική πληροφορία μέσω της plotly:

Για το ακόλουθο παράδειγμα χρειαζόμαστε το αρχείο: https://www.dropbox.com/s/brqaopz8g2vs0ox/covid_fasta.gz?dl=1